
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib'; // TODO depends on DataZoom and Brush

import * as zrUtil from 'zrender/lib/core/util.js';
import BrushController from '../../helper/BrushController.js';
import BrushTargetManager from '../../helper/BrushTargetManager.js';
import * as history from '../../dataZoom/history.js';
import sliderMove from '../../helper/sliderMove.js';
import { ToolboxFeature } from '../featureManager.js';
import { makeInternalComponentId, parseFinder } from '../../../util/model.js';
import { registerInternalOptionCreator } from '../../../model/internalComponentCreator.js';
var each = zrUtil.each;
var DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_');
var ICON_TYPES = ['zoom', 'back'];

var DataZoomFeature =
/** @class */
function (_super) {
	__extends(DataZoomFeature, _super);

	function DataZoomFeature() {
		return _super !== null && _super.apply(this, arguments) || this;
	}

	DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) {
		if (!this._brushController) {
			this._brushController = new BrushController(api.getZr());

			this._brushController.on('brush', zrUtil.bind(this._onBrush, this)).mount();
		}

		updateZoomBtnStatus(featureModel, ecModel, this, payload, api);
		updateBackBtnStatus(featureModel, ecModel);
	};

	DataZoomFeature.prototype.onclick = function (ecModel, api, type) {
		handlers[type].call(this);
	};

	DataZoomFeature.prototype.remove = function (ecModel, api) {
		this._brushController && this._brushController.unmount();
	};

	DataZoomFeature.prototype.dispose = function (ecModel, api) {
		this._brushController && this._brushController.dispose();
	};

	DataZoomFeature.prototype._onBrush = function (eventParam) {
		var areas = eventParam.areas;

		if (!eventParam.isEnd || !areas.length) {
			return;
		}

		var snapshot = {};
		var ecModel = this.ecModel;

		this._brushController.updateCovers([]); // remove cover

		var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, {
			include: ['grid']
		});
		brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
			if (coordSys.type !== 'cartesian2d') {
				return;
			}

			var brushType = area.brushType;

			if (brushType === 'rect') {
				setBatch('x', coordSys, coordRange[0]);
				setBatch('y', coordSys, coordRange[1]);
			} else {
				setBatch({
					lineX: 'x',
					lineY: 'y'
				}[brushType], coordSys, coordRange);
			}
		});
		history.push(ecModel, snapshot);

		this._dispatchZoomAction(snapshot);

		function setBatch(dimName, coordSys, minMax) {
			var axis = coordSys.getAxis(dimName);
			var axisModel = axis.model;
			var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range.

			var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();

			if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {
				minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan);
			}

			dataZoomModel && (snapshot[dataZoomModel.id] = {
				dataZoomId: dataZoomModel.id,
				startValue: minMax[0],
				endValue: minMax[1]
			});
		}

		function findDataZoom(dimName, axisModel, ecModel) {
			var found;
			ecModel.eachComponent({
				mainType: 'dataZoom',
				subType: 'select'
			}, function (dzModel) {
				var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);
				has && (found = dzModel);
			});
			return found;
		}
	};

	DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) {
		var batch = []; // Convert from hash map to array.

		each(snapshot, function (batchItem, dataZoomId) {
			batch.push(zrUtil.clone(batchItem));
		});
		batch.length && this.api.dispatchAction({
			type: 'dataZoom',
			from: this.uid,
			batch: batch
		});
	};

	DataZoomFeature.getDefaultOption = function (ecModel) {
		var defaultOption = {
			show: true,
			filterMode: 'filter',
			// Icon group
			icon: {
				zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',
				back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'
			},
			// `zoom`, `back`
			title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']),
			brushStyle: {
				borderWidth: 0,
				color: 'rgba(210,219,238,0.2)'
			}
		};
		return defaultOption;
	};

	return DataZoomFeature;
}(ToolboxFeature);

var handlers = {
	zoom: function () {
		var nextActive = !this._isZoomActive;
		this.api.dispatchAction({
			type: 'takeGlobalCursor',
			key: 'dataZoomSelect',
			dataZoomSelectActive: nextActive
		});
	},
	back: function () {
		this._dispatchZoomAction(history.pop(this.ecModel));
	}
};

function makeAxisFinder(dzFeatureModel) {
	var setting = {
		xAxisIndex: dzFeatureModel.get('xAxisIndex', true),
		yAxisIndex: dzFeatureModel.get('yAxisIndex', true),
		xAxisId: dzFeatureModel.get('xAxisId', true),
		yAxisId: dzFeatureModel.get('yAxisId', true)
	}; // If both `xAxisIndex` `xAxisId` not set, it means 'all'.
	// If both `yAxisIndex` `yAxisId` not set, it means 'all'.
	// Some old cases set like this below to close yAxis control but leave xAxis control:
	// `{ feature: { dataZoom: { yAxisIndex: false } }`.

	if (setting.xAxisIndex == null && setting.xAxisId == null) {
		setting.xAxisIndex = 'all';
	}

	if (setting.yAxisIndex == null && setting.yAxisId == null) {
		setting.yAxisIndex = 'all';
	}

	return setting;
}

function updateBackBtnStatus(featureModel, ecModel) {
	featureModel.setIconStatus('back', history.count(ecModel) > 1 ? 'emphasis' : 'normal');
}

function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {
	var zoomActive = view._isZoomActive;

	if (payload && payload.type === 'takeGlobalCursor') {
		zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false;
	}

	view._isZoomActive = zoomActive;
	featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');
	var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, {
		include: ['grid']
	});
	var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) {
		return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect';
	});

	view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? {
		brushType: 'auto',
		brushStyle: featureModel.getModel('brushStyle').getItemStyle()
	} : false);
}

registerInternalOptionCreator('dataZoom', function (ecModel) {
	var toolboxModel = ecModel.getComponent('toolbox', 0);
	var featureDataZoomPath = ['feature', 'dataZoom'];

	if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) {
		return;
	}

	var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath);
	var dzOptions = [];
	var finder = makeAxisFinder(dzFeatureModel);
	var finderResult = parseFinder(ecModel, finder);
	each(finderResult.xAxisModels, function (axisModel) {
		return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex');
	});
	each(finderResult.yAxisModels, function (axisModel) {
		return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex');
	});

	function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) {
		var axisIndex = axisModel.componentIndex;
		var newOpt = {
			type: 'select',
			$fromToolbox: true,
			// Default to be filter
			filterMode: dzFeatureModel.get('filterMode', true) || 'filter',
			// Id for merge mapping.
			id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex
		};
		newOpt[axisIndexPropName] = axisIndex;
		dzOptions.push(newOpt);
	}

	return dzOptions;
});
export default DataZoomFeature;